package Enum;

import org.junit.Test;

import java.util.Arrays;

public class Demo04 {
   @Test
    public void test(){
       //01-返回当前枚举值的名称
       System.out.println(Score.B.name());//B
       System.out.println(Score.B.toString());//B

       //02-打印当前枚举值在枚举类中声明的顺序
       System.out.println(Score.B.ordinal());//1,第2个枚举值

       /*使用场景：
        * 实际开发中表单提交过来的值是字符串类型，需要验证此字符串是否是我们定义的枚举值
        * 如果可以转换，说明提交的字符串没有问题，是我们预先定义好的枚举值
        * 如果不可以转换，说明提交过来的字符串有误,会报非法参数异常，没有这个枚举值*/
       //03-将字符串转成对应的枚举类型，注意这个类型必须是已有的枚举值
       //String str = "Cc";//IllegalArgumentException: No enum constant cn.tedu.oop.Score.Cc
       String str = "C";
       Score score = Score.valueOf(Score.class, str);
       System.out.println(score);
       //将字符串转成枚举类型的方式2，此种推荐，简单
       System.out.println(Score.valueOf(str));

       Score[] values = Score.values();
       System.out.println(Arrays.toString(values));

   }
}
//1.使用enum关键字定义枚举类
enum Score {
    //2.列出本类的多个枚举对象
    A("100-80") {
        //7.给每个枚举对象实现刚刚步骤6定义的抽象方法
        public String localeScore() {
            return "优";
        }
    }, B("79-60") {
        public String localeScore() {
            return "中";
        }
    }, C("59-0") {
        public String localeScore() {
            return "差";
        }
    };
    //3.定义一个私有的属性，封装每个对象对应的分数
    private final String score;

    //4.定义一个私有的构造函数
    private Score(String score) {
        this.score = score;
    }

    //5.定义一个输出成绩的抽象方法
    public abstract String localeScore();

    //6.定义一个公共的获取成绩的方法
    public String getScore() {
        return this.score;
    }
}
